package Servicios;

import java.util.List;

import Negocio.Sucursal;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;

/**
 * DAO de Sucursal (Singleton) Esta clase se encarga de brindar las funciones
 * necesarias para manejar las <b>Sucursales</b> en la base de datos. Podremos
 * obtener todas las sucursales, una sucursal en particular, guardar o
 * actualizar una sucursal y eliminar una sucursal.
 *
 */
public class ServicioSucursales {
	private IRepository<Sucursal> repositorioSucursales;
	private static ServicioSucursales instance = null;

	private ServicioSucursales() {
		this.repositorioSucursales = new Repository<Sucursal>();
	}

	public static ServicioSucursales getInstance() {
		if (instance == null) {
			instance = new ServicioSucursales();
		}
		return instance;
	}

	/**
	 * Funcion que retorna todas las sucursales de la base de datos
	 * 
	 * @return List<Sucursal> sucursales
	 * @throws ServiceException
	 */
	public List<Sucursal> getSucursales() throws ServiceException {
		List<Sucursal> sucursales;

		try {
			sucursales = this.repositorioSucursales.getAll(Sucursal.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}

		return sucursales;
	}

	/**
	 * Se crea la ucursal en caso de que la misma no exista en la base de datos,
	 * de existir se realiza una actualizacion.
	 * 
	 * @param Sucursal
	 *            sucursal
	 * @throws ServiceException
	 */
	public void guardarOActualizar(Sucursal sucursal) throws ServiceException {
		try {
			this.repositorioSucursales.saveOrUpdate(sucursal);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public Sucursal getSucursal(String sucursalId) throws RepositoryException {
		String queryExpression = "from Sucursal c where c.sucursalId = :sucursalId";
		QueryParameter parameter = new QueryParameter("sucursalId", sucursalId);
		Sucursal sucursal = this.repositorioSucursales.get(queryExpression,
				parameter);

		return sucursal;
	}
	public Sucursal getSucursalPorNombre(String nombreSucursal) throws RepositoryException {
		String queryExpression = "from Sucursal c where c.nombre = :nombre";
		QueryParameter parameter = new QueryParameter("nombre", nombreSucursal);
		Sucursal sucursal = this.repositorioSucursales.get(queryExpression,
				parameter);

		return sucursal;
	}

	public Boolean existeSucursal(String sucursalId) throws RepositoryException {
		return this.getSucursal(sucursalId) != null;
	}
	
	/**
	 * Funcion para eliminar una sucursal de la base de datos
	 * 
	 * @param Sucursal
	 *            sucursal
	 * @throws RepositoryException
	 */
	public void eliminarSucursal(Sucursal sucursal) throws RepositoryException {
		this.repositorioSucursales.delete(sucursal);
	}
	
	public static void main(String[] args) throws RepositoryException {
		Sucursal sucursal = ServicioSucursales.getInstance().getSucursal("1");
		int suma = 2 * 4;
		int c = suma + 3;
	}

}
